ক্লোজার (Clojure) একটি ফাংশনাল প্রোগ্রামিং ভাষা, যেখানে Scope (স্কোপ) এবং Variable Binding (ভেরিয়েবল বাইন্ডিং) এর ধারণাগুলি প্রোগ্রামিংয়ের মূল অংশ। এই দুটি ধারণা ভেরিয়েবলগুলোর জীবনকাল এবং অ্যাক্সেস নিয়ন্ত্রণ করতে সহায়ক, এবং ডেটা ম্যানিপুলেশন ও ফাংশনাল প্রোগ্রামিংয়ে গুরুত্বপূর্ণ ভূমিকা পালন করে।
Scope হল একটি প্রোগ্রাম অংশ যেখানে একটি ভেরিয়েবল বা নাম কার্যকর থাকে। এটি একটি ভেরিয়েবলের দৃশ্যমানতা এবং অ্যাক্সেস নিয়ন্ত্রণ করে, যার ফলে একটি ভেরিয়েবল কোথায় এবং কখন ব্যবহৃত হতে পারে তা নির্ধারণ করা হয়। স্কোপের দুটি প্রধান ধরনের বিভাজন:
(def global-var 10) ; গ্লোবাল স্কোপ
(defn my-function []
(let [local-var 5] ; লোকাল স্কোপ
(println "Global Var: " global-var) ; global-var অ্যাক্সেস করা যাবে
(println "Local Var: " local-var))) ; local-var অ্যাক্সেস করা যাবে
(my-function)
(println global-var) ; আউটপুট: 10
(println local-var) ; এই লাইনটি এরর দিবে, কারণ local-var লোকাল স্কোপে।
এখানে, global-var
একটি গ্লোবাল স্কোপে ডিফাইন করা হয়েছে, তাই এটি ফাংশনের বাইরে কোথাও অ্যাক্সেস করা যেতে পারে। তবে local-var
শুধুমাত্র my-function
এর ভিতরে অ্যাক্সেসযোগ্য, এবং বাইরের কোডে এটি অ্যাক্সেস করা সম্ভব নয়।
Variable Binding হল ভেরিয়েবলের জন্য একটি মান নির্ধারণ করা এবং সেই মানটি ভেরিয়েবলের সাথে "বাইন্ড" করা। ক্লোজারে বিভিন্নভাবে ভেরিয়েবল বাইন্ড করা হয়, এবং এর বিভিন্ন প্রক্রিয়া ভেরিয়েবলের জীবনকাল এবং স্কোপ নিয়ন্ত্রণ করে। সাধারণত ভেরিয়েবল বাইন্ডিংয়ের জন্য def
, let
, binding
, এবং with
ব্লক ব্যবহার করা হয়।
def
- গ্লোবাল ভেরিয়েবল বাইন্ডিংdef
ব্যবহার করে একটি ভেরিয়েবল গ্লোবাল স্কোপে বাইন্ড করা হয়, অর্থাৎ এটি প্রোগ্রামের যেকোনো স্থানে অ্যাক্সেসযোগ্য।
(def my-var 42) ; গ্লোবাল স্কোপে বাইন্ডিং
(println my-var) ; আউটপুট: 42
let
- লোকাল ভেরিয়েবল বাইন্ডিংlet
ব্যবহার করে একটি লোকাল স্কোপে ভেরিয়েবল বাইন্ড করা হয়। let
একটি ব্লকের মধ্যে ভেরিয়েবলগুলি ডিফাইন করে এবং সেই ভেরিয়েবলগুলির মান ব্লকটির মধ্যে সীমাবদ্ধ থাকে।
(let [x 10
y 20]
(+ x y)) ; আউটপুট: 30
এখানে, x
এবং y
একটি লোকাল স্কোপে বাইন্ড করা হয়েছে এবং তারা শুধুমাত্র let
ব্লকের ভিতরে অ্যাক্সেসযোগ্য।
binding
- ডাইনামিক বাইন্ডিংbinding
ব্যবহার করে ডাইনামিক স্কোপে ভেরিয়েবল বাইন্ড করা হয়, যা ঐ স্কোপের মধ্যে সমস্ত ফাংশনে পরিবর্তনশীল মান প্রয়োগ করে। binding
সাধারণত যখন আপনাকে মানগুলি প্রোগ্রামের চলাকালীন সময়ে পরিবর্তন করতে হয় তখন ব্যবহৃত হয়।
(def ^:dynamic *my-dynamic-var* 100) ; ডাইনামিক স্কোপে বাইন্ডিং
(defn example-fn []
(println *my-dynamic-var*))
(binding [*my-dynamic-var* 200] ; ডাইনামিক স্কোপে মান পরিবর্তন
(example-fn)) ; আউটপুট: 200
এখানে, *my-dynamic-var*
ডাইনামিকভাবে বাইন্ড করা হয়েছে, এবং binding
ব্লকটির ভিতরে এর মান পরিবর্তিত হয়েছে।
with
- সময়কালের জন্য ভেরিয়েবল বাইন্ডিংwith
ব্যবহার করে একটি ভেরিয়েবল এক নির্দিষ্ট সময়কাল (scope) জন্য বাইন্ড করা হয়, সাধারণত কোন বিশেষ কাঠামো বা সিস্টেমের জন্য এটি ব্যবহার করা হয় (যেমন লগিং, রিসোর্স ম্যানেজমেন্ট, ইত্যাদি)।
(with-open [rdr (clojure.java.io/reader "file.txt")]
(println (slurp rdr)))
এখানে, with-open
একটি নির্দিষ্ট সময়ের জন্য rdr
ভেরিয়েবলটি বাইন্ড করে এবং ফাইলটি খুলে পড়ে।
ভেরিয়েবল বাইন্ডিং মূলত দুটি প্রধান কাজ করে:
কনসেপ্ট | বর্ণনা | উদাহরণ |
---|---|---|
Scope | স্কোপ একটি প্রোগ্রাম অংশ যেখানে একটি ভেরিয়েবল অ্যাক্সেসযোগ্য | গ্লোবাল স্কোপ: def , লোকাল স্কোপ: let |
Variable Binding | ভেরিয়েবলকে একটি মানের সাথে যুক্ত করা | গ্লোবাল বাইন্ডিং: def , লোকাল বাইন্ডিং: let , ডাইনামিক বাইন্ডিং: binding |
স্কোপ এবং ভেরিয়েবল বাইন্ডিংয়ের মাধ্যমে ক্লোজারে ভেরিয়েবলগুলির অ্যাক্সেস, জীবনকাল, এবং তাদের মানের পরিবর্তন নিয়ন্ত্রণ করা হয়, যা ফাংশনাল প্রোগ্রামিংয়ের মডুলার কোডিং এবং প্রোগ্রাম ডিবাগিংয়ের জন্য অপরিহার্য।
common.read_more